package com.group01.handler;

import com.group01.exception.SystemException;
import com.group01.result.Result;
import com.group01.utils.LogUtil;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description 全局异常处理器
 * @Author 翟玉龙
 * @Date 2024/6/15
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 自定义异常处理
     * @param e 异常类
     * @return 异常提示
     */
    @ExceptionHandler(SystemException.class)
    public Result<String> handleException(SystemException e) {
        LogUtil.error("发生异常： " + e.getMessage() , e );
        return Result.error(e.getCodeAndMessageEnum());
    }

    /**
     * 参数校验异常处理
     * @param e 异常类
     * @return 异常提示
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<String> handleException(MethodArgumentNotValidException e) {
        LogUtil.error("发生异常： " + e.getMessage(), e);
        BindingResult bindingResult = e.getBindingResult();
        List<String> errors = new ArrayList<>();
        bindingResult.getFieldErrors().forEach(error -> {
            String fieldName = error.getField();
            String errorMessage = error.getDefaultMessage();
            errors.add(fieldName + ": " + errorMessage);
        });
        StringBuilder error = new StringBuilder();
        for (int i = 0; i < errors.size(); i++) {
            error.append(errors.get(i));
            if (i < errors.size() - 1) {
                error.append(",");
            }
        }
        return Result.error(error.toString());
    }


    /**
     * 全局异常处理
     * @param e 异常类
     * @return 异常提示
     */
    @ExceptionHandler(Exception.class)
    public Result<String> handleException(Exception e) {
        LogUtil.error("发生异常： " + e.getMessage() , e );
        return Result.error(StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "系统内部错误");
    }
}
